﻿#define _CRT_SECURE_NO_WARNINGS 1
//n - 皇后问题
//n−皇后问题是指将 n 个皇后放在 n×n 的国际象棋棋盘上，使得皇后不能相互攻击到，即任意两个皇后都不能处于同一行、同一列或同一斜线上。
//现在给定整数 n，请你输出所有的满足条件的棋子摆法。
//
//输入格式
//共一行，包含整数 n。
//
//输出格式
//每个解决方案占 n 行，每行输出一个长度为 n 的字符串，用来表示完整的棋盘状态。
//
//其中.表示某一个位置的方格状态为空，Q 表示某一个位置的方格上摆着皇后。
//
//每个方案输出完成后，输出一个空行。
//
//注意：行末不能有多余空格。
//
//输出方案的顺序任意，只要不重复且没有遗漏即可。
//
//数据范围
//1≤n≤9
//输入样例：
//4
//输出样例：
//.Q..
//...Q
//Q...
//..Q.
//
//..Q.
//Q...
//...Q
//.Q..


#include <iostream>
using namespace std;
const int N = 20;

// bool数组用来判断搜索的下一个位置是否可行
// col列，dg对角线，udg反对角线
// g[N][N]用来存路径

int n;
char g[N][N];
bool col[N], dg[N], udg[N];

void dfs(int u) {
    // u == n 表示已经搜了n行，故输出这条路径
    if (u == n) {
        for (int i = 0; i < n; i++) puts(g[i]);   // 等价于cout << g[i] << endl;
        puts("");  // 换行
        return;
    }

    // 枚举u这一行，搜索合法的列
    int x = u;
    for (int y = 0; y < n; y++)
        // 剪枝(对于不满足要求的点，不再继续往下搜索)  
        if (col[y] == false && dg[y - x + n] == false && udg[y + x] == false) {
            col[y] = dg[y - x + n] = udg[y + x] = true;
            g[x][y] = 'Q';
            dfs(x + 1);
            g[x][y] = '.';  // 恢复现场
            col[y] = dg[y - x + n] = udg[y + x] = false;
        }
}

int main() {
    cin >> n;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            g[i][j] = '.';

    dfs(0);

    return 0;
}
